#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>

#define TASK_MAX 100
uint8_t cur_len = 0;

typedef void (* task_handle_t)(void);
typedef struct
{
	task_handle_t	handle;
	uint16_t		curT;
	uint16_t		totalT;
} task_t;

task_t task_list[TASK_MAX];

void task_list_init(void);
int add_task(task_handle_t, uint16_t);
void task_schedule(void);

void task1(void);
void task2(void);
void task3(void);



int 
main(int argc, char *argv[])
{
	task_list_init();

	if(add_task(task1, 10) == -1)
		fatal("add_task(task1) failed\n");

	if(add_task(task2, 30) == -1)
		fatal("add_task(task2) failed\n");

	if(add_task(task3, 100) == -1)
		fatal("add_task(task3) failed\n");


	task_schedule();
}

void task1(void)
{
	printf("task1: I love you\n");
}

void task2(void)
{
	printf("task2: hfhadfdfa fdsafdsa\n");
}

void task3(void)
{
	printf("task3: hallo world\n");
}

void task_list_init(void)
{
	for(int i=0; i<TASK_MAX; i++)
	{
		task_list[i].handle = NULL;
		task_list[i].curT = 0;
		task_list[i].totalT = 0;
	}
}

int add_task(task_handle_t fun, uint16_t period)
{
	if(cur_len >= TASK_MAX || period <= 0)
		return -1;
	task_list[cur_len].handle = fun;
	task_list[cur_len].curT = period;
	task_list[cur_len].totalT = period;
	
	cur_len ++;

	return 0;
}

void task_schedule(void)
{
	while(1)
	{
		for(int i=0; i<cur_len; i ++)
		{
			task_list[i].curT -= 1;
			if(task_list[i].curT <= 0)
			{
				task_list[i].curT = task_list[i].totalT;
				task_list[i].handle();
			}
		}

		sleep(1);
	}
}
